import numpy as np
import math


def softmax(inMatrix):
    m, n = np.shape(inMatrix)
    outMatrix = np.matrix(np.zeros((m, n)))
    # outMatrix = np.array(np.zeros((m, n)))
    soft_sum = 0
    for idx in range(0, n):
        outMatrix[0, idx] = math.exp(inMatrix[0, idx])
        soft_sum += outMatrix[0, idx]
    for idx in range(0, n):
        outMatrix[0, idx] /= soft_sum
    return outMatrix


if __name__ == '__main__':
    a = np.array([[1, 2, 3, 4, 5]])
    # result = softmax(a)
    # print(result)

import numpy as np


def softmax(z):
    """
    计算 Softmax 函数的输出。
    z (numpy.ndarray): 输入向量或矩阵
    outMatrix: Softmax 函数的输出
    """
    # 防止数值溢出，减去最大值。当输入向量的值很大时，直接计算指数可能会导致溢出。通过减去最大值，可以将最大的指数项变为 0，从而避免溢出
    z = z - np.max(z, axis=-1, keepdims=True)  # axis=-1表示沿着最内层的轴进行操作，keepdims=True表示操作后的结果保持原数组的维度
    exp_z = np.exp(z)  # 计算每个元素的指数
    sum_exp_z = np.sum(exp_z, axis=-1, keepdims=True)  # 计算所有指数的和
    outMatrix = exp_z / sum_exp_z  # 归一化
    return outMatrix


# 示例
z = np.array([1.0, 2.0, 3.0, 4.0])
softmax_output = softmax(z)
print("Input vector:", z)  # [1. 2. 3. 4.]
print("Softmax output:", softmax_output)  # [0.0320586  0.08714432 0.23688282 0.64391426]
